const artTemplate = require('art-template')

async function errorHandler(err, ctx) {
  let type = getType(err, ctx)
  let status = getStatus(err)
  let data = getData(err)

  console.log("errorHandler\r\n", JSON.stringify(err))

  ctx.status = status
  switch (type) {
    case 'text':
      ctx.type = 'text/plain';
      ctx.body = data;
      break;
    case 'json':
      ctx.type = 'application/json';
      ctx.body = JSON.stringify(data)
      break;
    case 'html':
    default:
      ctx.type = 'text/html';
      await ctx.render('error', data);
  }
  return 
}

// 获取返回之的类型
function getType(err, ctx) {
  let type = ctx.accepts('html', 'text', 'json')
  if (err.option != undefined && err.option.type) {
    type = err.option.type
  }
  return type
}

// 获取返回之的类型
function getStatus(err) {
  let status = err.status
  if (err.option != undefined && err.option.status != undefined) {
    status = err.option.status
  }
  return status
}

// 获取返回内容的值
function getData(err) {
  let data = { code: 0, status: false }
  data.message = err.message ? err.message : 'fail'

  // 对敏感的错误信息处理
  if (data.message.indexOf('connect ECONNREFUSED') >= 0) {
    data.message = 'Database is not connected'
  }

  if (err.data != undefined && Object.prototype.toString.call(err.data) === '[object Object]') {
    data = Object.assign(data, err.data)
  }
  return data
}

// 获取处理参数
function getOption(err) {
  let option = {}
  if (err.option != undefined && Object.prototype.toString.call(err.option) === '[Object Object]') {
    option = Object.assign(option, err.option)
  }
  return option
}


module.exports = errorHandler